package org.sang.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.google.common.collect.Lists;
import com.google.gson.Gson;
import com.mysql.cj.core.util.StringUtils;
import org.sang.bean.StoreInfo;
import org.sang.bean.StoreInfoExample;
import org.sang.common.SnowflakeIdGeneratorUtils;
import org.sang.common.UserUtils;
import org.sang.dto.StoreInfoTypeRepDto;
import org.sang.exception.ConsumeException;
import org.sang.mapper.ext.StoreInfoExtMapper;
import org.sang.service.IStoreInfoService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * 〈一句话描述〉
 * 〈功能详细描述〉
 *
 * @author Naughty
 * @version 2018/4/4
 * @see StoreInfoServiceImpl
 * @since 1.0
 */
@Service
@Transactional(rollbackFor = Exception.class)
public class StoreInfoServiceImpl implements IStoreInfoService{

    private static final Logger logger = LoggerFactory.getLogger(StoreInfoServiceImpl.class);

    @Autowired
    StoreInfoExtMapper storeInfoExtMapper;

    private static Gson gson = new Gson();
    /**
     * 新增.
     */
    @Override
    public StoreInfo insertStoreInfo(StoreInfo storeInfo) {
        try {
            //查找有没有存在的门店
            StoreInfoExample storeInfoExample = new StoreInfoExample();
            storeInfoExample.createCriteria().andStoreNumberEqualTo(storeInfo.getStoreNumber())
                .andStoreNameEqualTo(storeInfo.getStoreName());
            List<StoreInfo> storeInfos = storeInfoExtMapper.selectByExample(storeInfoExample);
            if(!CollectionUtils.isEmpty(storeInfos)){
                logger.error("门店信息已经存在,门店信息{}",gson.toJson(storeInfo));
                throw new ConsumeException("门店已经存在");
            }
            String storeId = String.valueOf(SnowflakeIdGeneratorUtils.getId());
            storeInfo.setStoreId(storeId);
            storeInfo.setCreatedOperator(UserUtils.getCurrentUser().getUsername());
            storeInfo.setCreatedTime(new Date());
            storeInfo.setUpdateOperator(UserUtils.getCurrentUser().getUsername());
            storeInfo.setUpdateTime(new Date());
            storeInfoExtMapper.insert(storeInfo);
            logger.info("新增门店信息门店序号{},门店名称{},成功",storeInfo.getStoreNumber(),storeInfo.getStoreName());
        } catch (Exception e) {
            logger.error("新增门店信息异常{}", e.getMessage());
            e.printStackTrace();
            throw new ConsumeException("新增门店异常");
        }
        return storeInfo;
    }

    /**
     * 修改.
     */
    @Override
    public StoreInfo updateStoreInfo(StoreInfo storeInfo) {
        storeInfo.setUpdateOperator(UserUtils.getCurrentUser().getUsername());
        storeInfo.setUpdateTime(new Date());
        storeInfoExtMapper.updateByStoreId(storeInfo);
        logger.info("门店记录{},更新信息", storeInfo.getStoreId());
        return storeInfo;
    }

    /**
     * 删除.
     */
    @Override
    public void deleteStoreInfo(String storeId) {
        try {
            StoreInfoExample storeInfoExample = new StoreInfoExample();
            storeInfoExample.createCriteria().andStoreIdEqualTo(storeId);
            storeInfoExtMapper.deleteByExample(storeInfoExample);
            logger.info("门店记录{},删除", storeId);
        } catch (Exception e) {
            logger.error("门店{},删除门店异常{}", storeId, e.getMessage());
            e.printStackTrace();
            throw new ConsumeException("删除门店记录异常");
        }
    }

    /**
     * 查找单个对象.
     */
    @Override
    public StoreInfo queryStoreInfo(String storeId) {
        logger.info("门店{},获取门店信息", storeId);
        StoreInfoExample storeInfoExample = new StoreInfoExample();
        storeInfoExample.createCriteria().andStoreIdEqualTo(storeId);
        List<StoreInfo> storeInfos=storeInfoExtMapper.selectByExample(storeInfoExample);
        if(CollectionUtils.isEmpty(storeInfos)){
            return null;
        }else{
            return storeInfos.get(0);
        }

    }

    @Override
    public Page<StoreInfo> findStoreInfoListByPage(Integer pageNum, Integer pageSize, StoreInfo storeInfo) {

        Page<StoreInfo> result = PageHelper.startPage(pageNum,pageSize);
        StoreInfoExample storeInfoExample = new StoreInfoExample();
        StoreInfoExample.Criteria criteria = storeInfoExample.createCriteria();

        if(!StringUtils.isNullOrEmpty(storeInfo.getStoreId())){
            criteria.andStoreIdEqualTo(storeInfo.getStoreId());
        }
        if(!StringUtils.isNullOrEmpty(storeInfo.getStatus())){
            criteria.andStatusEqualTo(storeInfo.getStatus());
        }
        if(!StringUtils.isNullOrEmpty(storeInfo.getStoreNumber())){
            criteria.andStoreNumberEqualTo(storeInfo.getStoreNumber());
        }
        if(!StringUtils.isNullOrEmpty(storeInfo.getStoreName())){
            criteria.andStoreNameEqualTo(storeInfo.getStoreName());
        }
        if(!StringUtils.isNullOrEmpty(storeInfo.getStoreManager())){
            criteria.andStoreManagerEqualTo(storeInfo.getStoreManager());
        }
        if(!StringUtils.isNullOrEmpty(storeInfo.getStoreAddr())){
            criteria.andStoreAddrLike(storeInfo.getStoreAddr());
        }
        storeInfoExtMapper.selectByExample(storeInfoExample);
        return result;
    }

    /**
     * 获取门店列表.
     *
     * @return
     */
    @Override
    public List<StoreInfoTypeRepDto> findStoreInfoAllList() {
        List<StoreInfo> storeInfos = storeInfoExtMapper.selectByExample(new StoreInfoExample());
        if(CollectionUtils.isEmpty(storeInfos)){
            return Lists.newArrayList();
        }else{
            return Optional.ofNullable(storeInfos)
                .orElse(Lists.newArrayList())
                .stream()
                .filter(Objects::nonNull)
                .map(s -> {
                    StoreInfoTypeRepDto storeInfoTypeRepDto = new StoreInfoTypeRepDto();
                    storeInfoTypeRepDto.setStoreId(s.getStoreId());
                    storeInfoTypeRepDto.setStoreName(s.getStoreName());
                    return storeInfoTypeRepDto;
                })
                .collect(Collectors.toList());
        }
    }
}
